package cn.highedu.boot03.mapper;

import cn.highedu.boot03.entity.User;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

/**
 * 用户持久层
 */
@Mapper // 持久层声明
public interface UserMapper {
    /**
     * 查询user表的所有数据
     */
    @Select("SELECT * FROM user")
    List<User> list();

    /**
     * 保存一个用户
     * 单值传递
     * #{username} 表示占位符
     * @Param("username") 注解 表示为占位符中的参数赋值 注解中的参数名要和占位符中的参数名保持一致
     */
    @Insert("insert into user values(null, #{username}, #{password}, #{nickname})")
    void insertUser1(@Param("username") String username, @Param("password") String password,
                     @Param("nickname") String nickname);
    /**
     * 对象传值
     * SQL语句中的占位符名 必须和User类中的属性名保持一致
     * 在MyBatis中 执行Insert、Update和Delete语句时 可以有返回值 必须是int 表示改变的数据库表条数
     */
    @Insert("insert into user values(null, #{username}, #{password}, #{nickname})")
    int insertUser2(User user);

    /**
     * Map传值
     * 适用于传递的参数不能使用同一个对象包含
     */
    @Insert("insert into user values(null, #{username}, #{password}, #{nickname})")
    void insertUser3(Map<String, Object> map);

    /**
     * 查询一个数据
     * MyBatis执行查询操作 使用select * 必须保证表中的字段名和类中的属性名一致
     * 如果不一致 在查询语句中通过起别名的形式和类中属性名保持一致
     */
    @Select("select * from user where id=#{id}")
    User getById(@Param("id") Integer id);

    /**
     * 修改一个数据
     */
    @Update("update user set username=#{username}, password=#{password}, nickname=#{nickname} where id=#{id}")
    void update(User user);

    /**
     * 删除一个数据
     */
    @Delete("delete from user where id=#{id}")
    void delete(@Param("id") Integer id);

    /**
     * 用户登录 根据用户名查询
     */
    @Select("select * from user where username=#{username}")
    User login(@Param("username") String username);
}
